"""
Redis缓存服务
"""
import json
import redis
from config import REDIS_CONFIG, REDIS_CACHE_TTL
from loguru import logger

class RedisService:
    """Redis缓存服务类"""
    
    def __init__(self):
        """初始化Redis连接"""
        try:
            self.redis_client = redis.StrictRedis(**REDIS_CONFIG)
            self.redis_client.ping()  # 测试连接
            logger.info("Redis连接成功")
        except redis.ConnectionError as e:
            logger.error(f"Redis连接失败: {e}")
            raise
    
    def set_data(self, key, data, ttl=REDIS_CACHE_TTL):
        """
        设置缓存数据
        
        Args:
            key: 缓存键名
            data: 要缓存的数据，将会被转换为JSON字符串
            ttl: 缓存过期时间（秒），默认使用配置中设置的值
        
        Returns:
            bool: 操作是否成功
        """
        try:
            # 将数据转换为JSON字符串
            json_data = json.dumps(data, ensure_ascii=False)
            # 存储到Redis
            self.redis_client.setex(key, ttl, json_data)
            logger.info(f"数据成功缓存到Redis，键: {key}")
            return True
        except Exception as e:
            logger.error(f"缓存数据到Redis失败: {e}")
            return False
    
    def get_data(self, key):
        """
        获取缓存数据
        
        Args:
            key: 缓存键名
        
        Returns:
            dict/None: 如果缓存存在，返回解析后的数据；否则返回None
        """
        try:
            # 从Redis获取数据
            data = self.redis_client.get(key)
            if data:
                # 解析JSON字符串
                result = json.loads(data)
                logger.info(f"从Redis成功获取缓存数据，键: {key}")
                return result
            logger.info(f"Redis中不存在键: {key}")
            return None
        except Exception as e:
            logger.error(f"从Redis获取数据失败: {e}")
            return None
    
    def delete_data(self, key):
        """
        删除缓存数据
        
        Args:
            key: 缓存键名
        
        Returns:
            bool: 操作是否成功
        """
        try:
            result = self.redis_client.delete(key)
            if result:
                logger.info(f"成功从Redis删除数据，键: {key}")
            else:
                logger.info(f"Redis中不存在键: {key}")
            return bool(result)
        except Exception as e:
            logger.error(f"从Redis删除数据失败: {e}")
            return False
    
    def exists(self, key):
        """
        检查键是否存在
        
        Args:
            key: 缓存键名
        
        Returns:
            bool: 键是否存在
        """
        try:
            return bool(self.redis_client.exists(key))
        except Exception as e:
            logger.error(f"检查Redis键是否存在失败: {e}")
            return False
    
    def clear_cache(self, pattern="*"):
        """
        清除匹配模式的所有缓存
        
        Args:
            pattern: 匹配模式，默认为"*"（所有键）
        
        Returns:
            int: 清除的键数量
        """
        try:
            keys = self.redis_client.keys(pattern)
            if keys:
                count = self.redis_client.delete(*keys)
                logger.info(f"已清除{count}个Redis缓存键")
                return count
            logger.info(f"没有匹配模式'{pattern}'的Redis键")
            return 0
        except Exception as e:
            logger.error(f"清除Redis缓存失败: {e}")
            return 0 